package controllers;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

import models.Comible;
import models.ComidaDieta;
import models.Dieta;
import models.Frecuente;
import models.Ingerido;
import models.Plan;
import models.TipoComida;
import models.Usuario;
import play.mvc.With;
import securesocial.provider.SocialUser;
import util.Utilities;
import controllers.securesocial.SecureSocial;

@With(SecureSocial.class)
public class Dietas extends CustomCRUD {    
	
	public static void index() {
		render();
	}
	
	public static void show(Long id) throws Exception {
		ObjectType type = ObjectType.get(getControllerClass());
		notFoundIfNull(type);
		
		Plan plan = Plan.findById(id);
		
		//TODO: esto no deberia ir aca
		if (plan.getDietas().isEmpty()) {
			plan.getDietas().clear();
			plan.activar();
			plan.save();
		}
		
		//TODO: ver donde van las validaciones para ver si esta activo el plan, rango de fechas, etc
		Dieta dieta = Dieta.findByFecha(id);
		String diaSemana = Utilities.getNombreDia(dieta.getFecha());
		
		List<Frecuente> frecuentes = buscarFrecuentes();
		render(getControllerName() + "/show2.html", type, plan, frecuentes, dieta, diaSemana);
	}
	
	public static List<Frecuente> buscarFrecuentes() {
		//TODO: debe ser en base al usuario logueado, mover codigo para no repetir
		Usuario user = Usuario.find("bySocialUserId", session.get("securesocial.user")).first();
		return Frecuente.findByCantiad(user.getId());
	}
	
	/**
	 * Retorna en formato Json los "comibles" encontrado segun el nombre
	 */
	public static void buscarAlimento(String nombre) {
		List<Comible> comibles = Comible.findByNombre(nombre);
		renderJSON(comibles);
	}
	
	/**
	 * Registrar de a un ingerido segun el tipo de comida
	 */
	public static void registrarIngerido(Long dietaId, String comida, Long alimentoId, Integer cantPorciones) throws Exception {
		System.out.println("dietaId: "+ dietaId + " comida: "+ comida + " alimentoId: "+ alimentoId + " cantPorc: " + cantPorciones);
		// TODO: por default la cantidad de porciones es 1 siempre que se agrega un comible?
		Dieta dieta = Dieta.findById(dietaId);
		Comible comible = Comible.findById(alimentoId);
		
		// cero indica que no tiene sugeridos, solo cant ingeridas
		Ingerido ingerido = new Ingerido(comible, 0);
		ingerido.setCantPorcionesIngeridas(cantPorciones);
		ingerido.setConsumido(Boolean.TRUE);
		boolean encontrado = false;
		
		for (ComidaDieta comidaDieta : dieta.getComidasDieta()) {
			if (TipoComida.valueOf(comida).equals(comidaDieta.getTipo())) {
				comidaDieta.agregarIngerido(ingerido);
				encontrado = true;
				break;
			}
		}
		
		if (!encontrado) {
			ComidaDieta comidaDieta = new ComidaDieta();
			comidaDieta.setTipo(TipoComida.valueOf(comida));
			comidaDieta.agregarIngerido(ingerido);
			dieta.getComidasDieta().add(comidaDieta);
		}
		
		//registrar como frecuente
		//TODO: debe ser en base al usuario logueado, mover codigo para no repetir
		Usuario usuario = Usuario.find("bySocialUserId", session.get("securesocial.user")).first();
		Frecuente findIfExists = Frecuente.findIfExists(usuario.getId(), comible.getId());
		
		if (findIfExists != null) {
			// sumar cantidad
			findIfExists.setCantidad(findIfExists.getCantidad() + cantPorciones);
			findIfExists.save();
		} else {
			Frecuente frecuente = new Frecuente(ingerido.getComible(), cantPorciones, usuario);
			usuario.getFrecuentes().add(frecuente);
			usuario.save();
		}
		
		dieta.save();
	}
	
	/**
	 * Elimina el alimento ingerido segun el tipo de comida
	 */
	public static void eliminarAlimento(Long dietaId, String comida, Long alimentoId) throws Exception {
		System.out.println("dietaId: "+ dietaId + " comida: "+ comida + " alimentoId: "+ alimentoId);
		
		Dieta dieta = Dieta.findById(dietaId);
		System.out.println("cant comidas: " + dieta.getComidasDieta().size());
		
		Iterator<ComidaDieta> iterator = dieta.getComidasDieta().iterator();
		while (iterator.hasNext()) {
			ComidaDieta comidaDieta = (ComidaDieta) iterator.next();
			if (TipoComida.valueOf(comida).equals(comidaDieta.getTipo())) {
				if (comidaDieta.getIngeridos().remove(Ingerido.findByComidaDieta(comidaDieta.getId(), alimentoId))) {
					break;
				}
			}
		}
		
		dieta.save();
		System.out.println("cant comidas: " + dieta.getComidasDieta().size());
	}
	
	/**
	 * Modifica la cantidad de porciones de un ingerido 
	 */
	public static void modificarIngerido(Long dietaId, String comida, Long comibleId, Integer cantPorciones) throws Exception {
		Dieta dieta = Dieta.findById(dietaId);
		Iterator<ComidaDieta> iterator = dieta.getComidasDieta().iterator();
		
		while (iterator.hasNext()) {
			ComidaDieta comidaDieta = (ComidaDieta) iterator.next();
			if (TipoComida.valueOf(comida).equals(comidaDieta.getTipo())) {
				Ingerido ingerido = Ingerido.findByComidaDieta(comidaDieta.getId(), comibleId);
				ingerido.setCantPorcionesIngeridas(cantPorciones);
				ingerido.setConsumido(Boolean.TRUE);
				ingerido.save();
				break;
			}
		}
	}
	
}
